package com.lc.admin.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.lc.admin.service.WorkFlowService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class WorkFlowServiceImpl implements WorkFlowService {

    @Autowired
    RuntimeService runtimeService;

    @Autowired
    HistoryService historyService;

    @Autowired
    TaskService taskService;

    @Override
    public void startProcess(String processDefinitionKey, String businessId, Map<String, Object> variables) {
        // 启动工作流
        runtimeService.startProcessInstanceByKey(processDefinitionKey, businessId, variables);

        // 自动完成第一步
        // 分析： 查询当前任务，可能养老顾问在办理多个老人的入住流程，院长审批之后又需要养老顾问继续办理，所以养老顾问的任务会有多个
        // 1、查询养老顾问的所有任务，肯定是多个任务
        // 2、如何判断是在第一步，通过在用户任务上定义的formKey来判断，第一步的formKey是0
        List<Task> allTask = taskService.createTaskQuery()
                .processInstanceBusinessKey(businessId)
                .list();

        for (Task task : allTask) {
            // 如果formKey==0,则完成任务
            if("0".equals(task.getFormKey())) {
                taskService.complete(task.getId());
            }
        }
    }

    /**
     * 公共的完成任务方法
     * 正常完成
     * 拒绝
     * 驳回
     */
    @Override
    public void complete(String taskId,String msg,Integer op) {
        Map<String,Object> map = new HashMap<>();
        map.put("msg",msg);
        // 如果是院长审批，需要携带op参数，取值是1,2，
        if(ObjectUtil.isNotEmpty(op)) {
            map.put("op",op);
        }
        taskService.complete(taskId,map);
    }

    /**
     * 院长审批-同意，下一步又回到第一步的养老顾问，查询第一步的用户id
     * @return
     */
    @Override
    public Long getGuwen(String taskId,String varibaleName) {
        HistoricVariableInstance variable = historyService.createHistoricVariableInstanceQuery()
                .taskId(taskId)
                .variableName(varibaleName)
                .singleResult();
        if(variable != null) {
            return Long.parseLong(variable.getValue().toString());
        }

        return 0L;
    }
}
